package cn.tedu.ba03;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

import java.util.Date;


@Aspect
public class MyAspect {

    /*@Around:环绕通知
        属性：value 切入点表达式
        位置：在方法定义的上面
      特点：
      1.它是功能最强的通知
      2.在目标方法的前和后都能增强功能
      3.控制目标方法是否被调用
      4.修改原来目标方法执行的结果
         参数：ProceedingJoinPoint
            作用：执行目标方法的
         返回值：就是目标方法的执行结果，可以被修改
       环绕通知：通常做事务处理：  在目标方法之前开启事务、执行目标方法、提交事务
    * */

    @Around(value = "execution(* cn.tedu.ba03.SomeServiceImpl.doFirst(..))")
    public Object myAround(ProceedingJoinPoint pjp) throws Throwable {
        String name=null;
        Object[] args = pjp.getArgs();
        if (args!=null&&args.length>1){
            name=(String)args[0];
        }
        Object proceed=null;
        System.out.println("环绕通知，在方法之前显示时间："+new Date());
        if ("lisi".equals(name)) {
            proceed = pjp.proceed();//控制目标方法的调用
        }
        System.out.println("环绕通知，在方法执行之后提交事务");
        if (proceed!=null){
            proceed="hello AspectJ";
        }
        return proceed;
    }


}
